package savet.gui.modelos;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedList;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import savet.entidades.atributos.Atributo;

/**
 *
 * @author Bsi 2007
 */
public class ModeloDataPadrao extends DefaultTableModel {

    private Date inicioPNotificado;
    private Date fimPNoficado;
    private LinkedList<String> header = new LinkedList<String>();
    private LinkedList<Integer> conjuntoAnos = new LinkedList<Integer>();
    private LinkedList<Integer> qtdMeses = new LinkedList<Integer>();

    private LinkedList<Atributo> atributos = new LinkedList<Atributo>();

    public ModeloDataPadrao() {
        inicioPNotificado = new Date();
        fimPNoficado = getUmAnoDepois();
        criarHeaders();
    }

    public ModeloDataPadrao(Date inicioPNotificado, Date fimPNotificado) {
        this.inicioPNotificado = inicioPNotificado;
        this.fimPNoficado = fimPNotificado;
        criarHeaders();
    }

    public void criarNovaLinha() {
        Object [] dados = new Object[getColumnCount()];
        for (int i = 0; i < dados.length; i++) {
            dados [i] = new Atributo();
        }
        addRow(dados);
    }

    private void criarHeaders() {
        Calendar c = new GregorianCalendar();
        c.setTime(inicioPNotificado);

        int mes = c.get(Calendar.MONTH);
        conjuntoAnos.add(c.get(Calendar.YEAR));
        qtdMeses.add(1);

        while (mes < 12 && !isIgualFimPeriodoNotificado(c.getTime())) {
            
            header.add(getMes(mes));
            if (mes == 0) {
                conjuntoAnos.add(c.get(Calendar.YEAR));
                qtdMeses.add(1);
            } else {
                int index = conjuntoAnos.size() - 1;
                int novaQtd = qtdMeses.get(index) + 1;
                qtdMeses.set(index, novaQtd);
            }
            c.add(Calendar.MONTH, 1);
            mes = c.get(Calendar.MONTH);

        }
        for (Integer x  : qtdMeses) {
            System.out.println("x = " + x);
        }
        setColumnIdentifiers(new Vector(header));
    }

    private boolean isIgualFimPeriodoNotificado(Date date) {
        Calendar c = new GregorianCalendar();
        Calendar fpn = new GregorianCalendar();

        c.setTime(date);
        fpn.setTime(fimPNoficado);

//        int diaComp = c.get(Calendar.DAY_OF_MONTH);
        int anoComp = c.get(Calendar.YEAR);
        int mesComp = c.get(Calendar.MONTH);

//        int diaFPN = fpn.get(Calendar.DAY_OF_MONTH);
        int anoFPN = fpn.get(Calendar.YEAR);
        int mesFPN = fpn.get(Calendar.MONTH);

        boolean result = anoComp == anoFPN && mesComp == mesFPN;

        return result;
    }

    private String getMes(int mes) {
//        mes = (mes > 12) ? mes - 12 : mes;
        switch (mes) {
            case 0:
                return "jan";
            case 1:
                return "fev";
            case 2:
                return "mar";
            case 3:
                return "abr";
            case 4:
                return "mai";
            case 5:
                return "jun";
            case 6:
                return "jul";
            case 7:
                return "ago";
            case 8:
                return "set";
            case 9:
                return "out";
            case 10:
                return "nov";
            case 11:
                return "dec";
            default:
                return "";
        }
    }

    private final Date getUmAnoDepois() {
        Calendar newCalendar = GregorianCalendar.getInstance();
        newCalendar.roll(Calendar.YEAR, true);
        return newCalendar.getTime();
    }

    @Override
    public String getColumnName(int column) {
        return header.get(column);
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return Atributo.class;
    }

    public LinkedList<Integer> getConjuntoAnos() {
        return conjuntoAnos;
    }

    public int getQtdMesesDoAno(int ano) {
        int indexOf = conjuntoAnos.indexOf(ano);
        return qtdMeses.get(indexOf);
    }

}
